package com.k.base.jdk.sync_async.demo;

import java.util.concurrent.*;

public class SyncTimeoutExample {
    public static void main(String[] args) {
        System.out.println("=====main start");
        test2();
        System.out.println("=====main end");
    }
    private static void test1(){
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(() -> {
            // 这里放置导致阻塞的代码，例如：
            System.out.println("任务执行中...");
            // 模拟 任务执行出错
//            if(true){
//                throw new RuntimeException("error");
//            }
            // 模拟 任务超时
//             Thread.sleep(1000*10); // 假设这是一个耗时的操作
//            System.out.println("任务执行完成");
            return "dog";
        });

        try {
            // 尝试在指定时间内获取结果，如果超时则抛出TimeoutException
            String result = future.get(6, TimeUnit.SECONDS);
            System.out.println("==== 获取执行结果：任务成功完成" + result);
        } catch (InterruptedException | ExecutionException e) {
            System.out.println("任务执行出错: " + e);
            Thread.currentThread().interrupt(); // 重新设置线程中断状态
        } catch (TimeoutException e) {
            System.out.println("任务超时，未在规定时间内完成");
            // 可以选择取消任务
            future.cancel(true);
        } finally {
            System.out.println("=====finally");
            executor.shutdownNow(); // 关闭线程池
        }
    }
    private static void test2(){
        try {
            CompletableFuture.supplyAsync(()-> {
                try {
                    TimeUnit.SECONDS.sleep(6);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return "ok";
            }).get(5,TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            System.out.println("任务中断");
            e.printStackTrace();
        } catch (ExecutionException e) {
            System.out.println("任务异常");
            e.printStackTrace();
        } catch (TimeoutException e) {
            System.out.println("任务超时");
            e.printStackTrace();
        }
    }
}
